/*************************************************************************
	> File Name: 5-3.c
	> Author: Angel Criss
	> Mail: abbytsing@gmail.com 
	> Created Time: Thu Jul 24 09:30:43 2014
 ************************************************************************/

/*
 以 ./5-3 f1 1000000 & ./5-3 f1 1000000
 和 ./5-3 f2 1000000 x & ./5-3 f2 1000000 x
 方式运行，结果时f1 > 2f2 
 原因是 f1使用了O_APPEND，虽然两个程序都在操作f1，但是前一个会阻塞后一个操作，相当于先执行
 一次5-3再执行一次5-3
 而 f2 则是同时又两个程序在写（没有先后） f2 第一个运行时写一个bit将offset1移到2，第二个运行时
 又从开始写一个bit将前一个写的覆盖掉，将offset2移到2，相当于只有一个在写，由于cpu调度的原因，
 有时会出现两个中的某一个写了几个bit后，另一个再写，这就是为什么 f2 不到 f1大小一半的原因
 */

#include "ch-5.h"

int main(int argc,char *argv[])
{
    if(argc<3||strcmp(argv[1],"--help")==0)
    {
        printf("%s filename offset\nor\n%s filename offset x\n",argv[0],argv[0]);
        exit(0);
    }

    int fd;
    long bit;

    bit=atol(argv[2]);
    if(argc==3)
    {

        if((fd=open(argv[1],O_CREAT|O_RDWR|O_APPEND,00644))==-1)
            err("open");
        while(bit--)
        {
            if(write(fd,"x",1)==-1)
                err("write");
        }
        close(fd);
    }
    else
    {
         if((fd=open(argv[1],O_RDWR|O_CREAT,00644))==-1)
             err("open");
         while(bit--)
        {
             lseek(fd,0,SEEK_END);
              if(write(fd,"x",1)==-1)
                 err("write");
        }
        close(fd);
    }

    printf("\tall done\n");

    exit(0);
}
